iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
SideProject30

初探 Godot系列 第 4

[DAY 4] 移動 (move_toward, lerp)

  • 分享至 

  • xImage
  •  

今日目標:探索不同的移動方式


事前準備(詳細作法如 Day2)

  1. 建立一個 Sprite2D 節點,並將 icon 放到屬性面板,儲存成一個 scene 作為後續使用。
  2. 建立一個新場景建立一個 Node 節點,儲存成 main 場景。
res://
|--scenes
|   |--godot_icon.tscn
|   |--main.tscn
|--scripts
|   |--main.gd
|--icon.svg
  1. 在 main 場景的 Node 節點上附加腳本,加上如昨天的基本資訊
# 暴露出 PackedScene 到屬性面板,儲存後將 icon 的 scene 放到 main scene node上腳本的屬性面板
@export var to_be_created:PackedScene
# 宣告變數
var godot:Node
# 在 ready 時直接生成我們的物件
func _ready():
	godot = to_be_created.instantiate()
	add_child(godot)

出發 (move_toward)

首先來看官方的說明

Vector2 move_toward(to: Vector2, delta: float) const
Returns a new vector moved toward to by the fixed delta amount. Will not go past the final value.

Vector2: 回傳的類別
move_toward:函數名稱
(...):需要的輸入,一個 Vector2 類別輸入及目標,一個 float 值作為移動的量
最後在說明中可以看到這個方法會回傳一個向量

接著實際操作測試

  • 在前面再暴露一個變數 weight 作為待會使用,可以在屬性面板調整數值。
@export var weight:float
  • 在 process 中透過 move_toward 得到新的位置並存在 pos 中
    # godot.position:起點
    # get_viewport().get_mouse_position():目標位置,這裡設為取得到的滑鼠位置
    # weight:剛剛宣告的變數,移動的單位
    var pos = godot.position.move_toward(get_viewport().get_mouse_position(), weight)
  • 現在我們拿到了距離起點到目標直線上 weight 單位距離的位置,直接改變 scene 的位置。
    godot.position = pos

執行

Yes

完成!

完整檔案

extends Node

@export var to_be_created:PackedScene
@export var weight:float
var godot:Node
# Called when the node enters the scene tree for the first time.
func _ready():
	godot = to_be_created.instantiate()
	add_child(godot)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	var pos = godot.position.move_toward(get_viewport().get_mouse_position(), weight)
	godot.position = pos

出發 (lerp)

再來看官方的說明

Vector2 lerp(to: Vector2, weight: float) const
Returns the result of the linear interpolation between this vector and to by amount weight. weight is on the range of 0.0 to 1.0, representing the amount of interpolation.

Vector2: 回傳的類別
lerp:函數名稱
(...):需要的輸入,一個 Vector2 類別輸入及目標,一個 float 值作為插值權重
說明中可以看到這個方法一樣會回傳一個向量不過此函數計算的方式是透過線性插值的方式實作

實際操作測試

  • 暴露一個變數 weight,可以在屬性面板調整數值。
@export var weight:float
  • 在 process 中透過 lerp 得到新的位置並存在 pos 中
    # godot.position:起點
    # get_viewport().get_mouse_position():目標位置,這裡設為取得到的滑鼠位置
    # weight:剛剛宣告的變數,插值的權重
    var pos = godot.position.move_toward(get_viewport().get_mouse_position(), weight)
  • 直接改變 scene 的位置。
    godot.position = pos

執行

Yes
可以感受到插值算法離目標越近速度逐漸減緩的感覺

完成!

完整檔案

extends Node

@export var to_be_created:PackedScene
@export var weight:float
var godot:Node
# Called when the node enters the scene tree for the first time.
func _ready():
	godot = to_be_created.instantiate()
	add_child(godot)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	var pos = godot.position.lerp(get_viewport().get_mouse_position(), weight)
	godot.position = pos

:)


上一篇
[DAY 3] 移動 (position, Vector2)
下一篇
[DAY 5] 旋轉 (rotation, rotated)
系列文
初探 Godot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言